Skip to content

feat: add launch landing site#686

Open
thymikee wants to merge 17 commits into
mainfrom
landing-launch
Open

feat: add launch landing site#686
thymikee wants to merge 17 commits into
mainfrom
landing-launch

Conversation

@thymikee

@thymikee thymikee commented Jun 3, 2026

Copy link
Copy Markdown
Member

Summary

Adds the new landing Next.js site for the public agent-device.dev launch, rebased onto latest main.

Adds the missing GitHub header link with a server-rendered live star counter cached for 4 hours.

Touched file count: 87. Scope is limited to the landing app.

Validation

Ran pnpm lint, pnpm audit:assets, pnpm build, and LANDING_SMOKE_URL=http://localhost:4312 pnpm smoke:browser. Browser smoke passed for 3 pages across 3 viewports.

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

Size Report

Metric Base Current Diff
JS raw 1.4 MB 1.4 MB 0 B
JS gzip 445.7 kB 445.7 kB 0 B
npm tarball 584.5 kB 584.5 kB 0 B
npm unpacked 2.0 MB 2.0 MB 0 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 21.2 ms 21.5 ms +0.3 ms
CLI --help 37.0 ms 37.1 ms +0.1 ms

Top changed chunks: no changes in the largest emitted chunks.

@thymikee thymikee closed this Jun 3, 2026
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
PR Preview Action v1.8.1
Preview removed because the pull request was closed.
2026-06-03 21:00 UTC

@thymikee thymikee left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: launch landing site

Reviewed the dynamic/data-flow surface (the static content + assets I skimmed only). Focused on perf, data flow, and API usage per the review criteria. Overall the server/client boundary is clean. Notes, all low-severity:

What works well

  • Resilient GitHub stats flow. getGitHubRepoStats uses next: { revalidate: 4h } for ISR caching, attaches GITHUB_TOKEN when present (avoids unauthenticated rate limits), and degrades gracefully to nullGitHubStarLinkFallback. The repo slug callstackincubator/agent-device matches the canonical one in README.md/package.json, so the counter resolves. Good defensive design.
  • Accessible, well-behaved carousel. hero-agent-carousel.tsx pauses on hover/focus/visibilitychange, honors prefers-reduced-motion, and drives everything through refs so the useCallbacks stay stable without stale-closure bugs. Nicely done.

Worth considering

  • Clipboard API ordering (prompt-copy-button.tsx). The primary path is the deprecated document.execCommand("copy"), with navigator.clipboard.writeText only as the fallback when that returns false. This is inverted from current best practice — the async Clipboard API is the standard and should be tried first, with execCommand as the legacy fallback. It works today, but it leads with a deprecated API.
  • force-dynamic on static text routes. llms.txt and llms-full.txt set export const dynamic = "force-dynamic", but createLlmsTxt()/createLlmsFullTxt() are build-time-constant. This opts the routes out of static optimization so each origin request recomputes them (mitigated by the manual Cache-Control + CDN). If the content is truly static, dropping force-dynamic (or force-static) lets Next serve them as static assets.
  • Nit — OG image fonts. og-image.tsx renders with system monospace/default sans rather than the bundled Alliance/Switzer brand fonts. Purely cosmetic; flagging only since the brand fonts are already in the bundle.

Noting this PR is already closed — happy to move these onto whichever PR carries the landing site forward if that's more useful.


Generated by Claude Code

@thymikee thymikee reopened this Jun 10, 2026
@thymikee

Copy link
Copy Markdown
Member Author

Landing preview automation is now wired via .github/workflows/landing-preview.yml and triggered on this reopened PR. Evidence: the new Deploy Landing Preview check appeared on PR #686 after reopening. It currently fails at Verify Vercel token because no VERCEL_TOKEN repository secret is available to Actions. Add a Vercel token secret for the linked landing/.vercel/project.json project and rerun the workflow to produce the preview URL comment.

Copy link
Copy Markdown
Member Author

Code review

Verdict: minor issues — clean, well-built marketing site; one broken CTA and a couple of content nits.

Findings

  1. Majorlanding/src/components/stack-support-section.tsx:19: the "Book consultation" button links to href="#demo", but #demo is the id of the very section the button sits in (SectionShell id="demo" at line 9), so clicking this lead-gen CTA does nothing. The equivalent CTAs on product pages (product-page.tsx:283) correctly link to the Callstack contact form — the "link demo cta to contact form" commit evidently missed this one.

  2. Minorlanding/src/components/home/footer.tsx:15-17: in the "Documentation" footer group, both the "Documentation" and "GitHub" links point to the same GitHub repo URL, making the Documentation link redundant given the project has a docs site.

  3. Minorlanding/src/app/fonts/AllianceNo2-*.ttf: four files of the commercial Alliance No.2 typeface (~355 KB) are committed to a public OSS repo; worth confirming the license permits public redistribution of the raw font files (Switzer/Geist are fine).

Checked and solid

  • GitHub star counter (landing/src/lib/github.ts): returns null on any failure, 4h next.revalidate set correctly, token only from process.env.GITHUB_TOKEN, and the consumer degrades to a "Stars" label via Suspense — a GitHub outage/rate-limit can't break the page.
  • List keys: all .map() renderings use stable content-based keys; no remaining index-key hazards.
  • Internal links/anchors: all resolve except #demo (finding 1).
  • CI workflow (landing-preview.yml): fork-PR guard, pinned action SHAs, secrets handled properly.
  • Workspace isolation: landing/ is a fully isolated pnpm workspace (own pnpm-workspace.yaml + lockfile), so the main package build and CI are unaffected.
  • No secrets in the diff; assets are all webp/svg, largest 107 KB; a11y/SEO (aria-labels, roving tabindex, reduced-motion, metadata/OG/sitemap/JSON-LD) are in good shape.

Overall

Fix the self-referencing #demo anchor and this is good to merge.


Generated by Claude Code

@thymikee

Copy link
Copy Markdown
Member Author

Addressed the actionable PR feedback in commit 19b54c259.

Before -> after evidence:

  • Prompt copy tried execCommand first -> now uses async Clipboard API first, with legacy textarea fallback.
  • /llms.txt and /llms-full.txt were forced dynamic -> now force-static; local build reports both routes as static.
  • OG images used default/monospace text -> now load the bundled Alliance brand font in ImageResponse.
  • "Book consultation" pointed at #demo -> now points to the Callstack contact form.
  • Footer "Documentation" pointed at GitHub -> now points to the docs site.

Validation:

  • pnpm lint
  • pnpm build
  • LANDING_SMOKE_URL=http://127.0.0.1:4312 pnpm smoke:browser

Notes:

  • Alliance font license/redistribution still needs owner confirmation; that is not verifiable from code.
  • Vercel preview automation retriggered and is currently pending. Earlier preview run was blocked by the missing repo VERCEL_TOKEN secret.

@thymikee

Copy link
Copy Markdown
Member Author

PR #686 adds a self-contained Next.js marketing site under landing/ (87 files) plus one paths:-gated Vercel preview workflow. The change does not touch any core CLI/daemon code, build config, or publish surface.

Regression risk: Low. The site is fully isolated from the published agent-device package:

  • Every changed file lives under landing/ except .github/workflows/landing-preview.yml — no src/, no root package.json, no root tsconfig*, no root pnpm-workspace.yaml, and no root pnpm-lock.yaml changes.
  • landing is not part of the root pnpm workspace (root pnpm-workspace.yaml lists only website) and ships its own landing/pnpm-lock.yaml and "private": true landing/package.json. Its dependency tree (Next 16, React 19, tailwind v4, etc.) never enters the core CLI install or build.
  • The root package.json files allowlist (bin, dist, ios-runner, macos-helper, skills, …) does not include landing, so the site cannot leak into the published npm tarball.
  • The new CI job is gated to paths: ["landing/**", …] and is a standalone Vercel deploy — it won't run on, slow, or break existing core CLI workflows.
  • No secrets committed: landing/src/lib/github.ts reads an optional GITHUB_TOKEN from process.env, and landing-preview.yml consumes secrets.VERCEL_TOKEN. No hardcoded keys/tokens in the diff.

Blocking:

  • None.

Non-blocking:

  • Workspace naming: root pnpm-workspace.yaml already declares a website package, and this PR introduces a parallel landing/ app outside that workspace with its own lockfile. Worth confirming whether website still exists / should be retired, and whether landing should eventually join the workspace for unified dep management — keeping it standalone is fine for now but means two lockfiles to maintain.
  • .github/workflows/landing-preview.yml runs pnpm dlx vercel@latest (pull/build/deploy) unpinned — pinning the Vercel CLI version would make preview builds reproducible, consistent with the SHA-pinned actions used elsewhere in the file.
  • Star counter (landing/src/lib/github.ts) caches for 4h via next: { revalidate } and degrades gracefully (returns null on non-OK/parse failure) — looks solid; no action needed.

Site is well-isolated; no impact on the core CLI/daemon package. Looks good from a regression standpoint.

🤖 Automated review via Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant